﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;

namespace Runda.EShop.Web.Shared
{
    public partial class ValidateCode : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            System.Random rand = new Random();
            int len = 4;// rand.Next(4, 6);   //返回一个字符长度为4-6之间的随机数
            char[] chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
            System.Text.StringBuilder myStr = new System.Text.StringBuilder();

            //StringBuilder 对象是动态对象，允许扩充它所封装的字符串中字符的数量
            for (int iCount = 0; iCount < len; iCount++)
            {
                myStr.Append(chars[rand.Next(chars.Length)]);
                //rand.Next(Int32)生成一个以Int32为上界的随机数
                //Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处
            }

            string text = myStr.ToString();
            // 保存验证码到 session 中以便其他模块使用 
            this.Session["Login_ValidateCode"] = text;
            Size ImageSize = new Size(80, 24); //Size.Empty;
            //Size存储一个有序整数对，通常为矩形的宽度和高度。
            Font myFont = new Font("MS Sans Serif", 15);
            //第一个参数为字体，第二个参数为字体大小
            // 计算验证码图片大小 bmp
            //using (Bitmap bmp = new Bitmap(10, 10))
            //{
            //    using (Graphics g = Graphics.FromImage(bmp))
            //    {
            //        SizeF size = g.MeasureString(text, myFont, 10000);
            //        //SizeF存储有序浮点数对，通常为矩形的宽度和高度
            //        //MeasureString测量用指定的 Font 绘制的指定字符串,第三个参数是指定文本的最大布局区域
            //        ImageSize.Width = (int)size.Width + 8;
            //        ImageSize.Height = (int)size.Height + 8;
            //    }
            //}
            // 创建验证码图片 
            using (Bitmap bmp = new Bitmap(ImageSize.Width, ImageSize.Height))
            {
                // 绘制验证码文本 
                using (Graphics g = Graphics.FromImage(bmp))
                {
                    g.Clear(Color.White);
                    //StringFormat封装文本布局信息（如对齐、文字方向和 Tab 停靠位），
                    //显示操作（如省略号插入和国家标准 (National) 数字替换）和 OpenType 功能
                    using (StringFormat f = new StringFormat())
                    {
                        f.Alignment = StringAlignment.Center;
                        //Alignment获取或设置垂直面上的文本对齐信息
                        f.LineAlignment = StringAlignment.Center;
                        //LineAlignment获取或设置水平面上的行对齐信息
                        f.FormatFlags = StringFormatFlags.NoWrap;
                        //NoWrap在矩形内设置格式时，禁用文本换行功能
                        //FormatFlags获取或设置包含格式化信息的 StringFormatFlags 枚举
                        g.DrawString(text, myFont, Brushes.Black, new RectangleF(0, 0, ImageSize.Width, ImageSize.Height), f);
                        //RectangleF用指定的位置和大小初始化 RectangleF 类的新实例              
                    }//using 
                }//using 
                // 制造噪声 杂点面积占图片面积的 20% 
                int num = ImageSize.Width * ImageSize.Height * 20 / 100;
                for (int iCount = 0; iCount < num; iCount++)
                {
                    // 在随机的位置使用随机的颜色设置图片的像素 
                    int x = rand.Next(ImageSize.Width);
                    int y = rand.Next(ImageSize.Height);
                    int r = rand.Next(255);
                    int g = rand.Next(255);
                    int b = rand.Next(255);
                    Color c = Color.FromArgb(r, g, b);
                    bmp.SetPixel(x, y, c);
                }//for 
                // 输出图片 
                System.IO.MemoryStream ms = new System.IO.MemoryStream();
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                this.Response.ContentType = "image/png";
                ms.WriteTo(this.Response.OutputStream);
                ms.Close();
            }//using 
            myFont.Dispose();
        }
    }
}